标准库头文件

  标准库的功能是通过一组标准头文件给出的(16.1.2节)。标准库头文件不需要后缀;它们被当做头文件是因为它们需要用#include<...>包含进来,而不是用#include"..."。缺少 .h 后缀并不意味着这些头文件必须采用某种特殊的存储方式。一个具体实现可以利用有关标准库定义的知识,去优化标准库的实现以及对标准头文件的处理方式。比如说,某个实现可以将标准数学库(22.3节)做成内部的,且将#include<cmath>当做一个开关,在使数学库能够使用的同时又不需要读入任何文件。

相对于每一个C标准库文件 <X.h>,存在着一个与之对应的标准C++头文件 <cX>。例如,#include <cstdio> 提供的是与#include <stdio.h>同样的东西。一个典型的<stdio.h>看起来是某种类似下面的东西

    #ifdef __cplusplus                // 只为了C++编译器(9.2.4节)
    namespace std {                   // 标准库定义在名字空间std里(8.2.9节)
    extern "C" {                      // 在stdio里的函数具有C连接(9.2.4节)
    #endif

        /* ... */
        int printf(const char* ...);
        /* ... */

    #ifdef __cplusplus
    }
    }
    using namespace std;                // 使printf在全局名字空间里可以使用
    #endif

也就是说,实际声明(基本上)都是共享的,但连接和名字空间问题则需要另行处理,以便使C和C++程序能共享这个头文件。

🔚